/* 请求体封装 */

import axios from "axios";
import config from './config';
import Qs from 'qs';
/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 */
// 创建axios实例json请求方式
const instance = axios.create({
  baseURL: config.host,
  timeout: 1000 * 10,
  headers: { 
    'Content-Type':'application/json'
  }
});
/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
instance.interceptors.request.use(
  config => {
    return config;
  },
  error => Promise.error(error)
);
// 响应拦截
instance.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    const { response } = error;
    if (response) {
      // 请求已发出，但是不在2xx的范围
      return Promise.reject(response);
    }
  }
);

/**
 * get方法
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params) {
  return new Promise((resolve, reject) => {
    instance
      .get(url, { params: params })
      .then(res => {
        resolve(res.data);
      })
      .catch(err => {
        reject(err.data);
      });
  });
}
/**
 * post方法
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post(url, params) {
  return new Promise((resolve, reject) => {
    instance.post(url,params)
      .then(res => {
        resolve(res.data);
      })
      .catch(err => {
        reject(err.data);
      });
  });
}

const keyValue = axios.create({
  baseURL: config.host,
  timeout: 1000 * 10,
  headers: { 
    'Content-Type':'application/x-www-form-urlencoded'
  },
  transformRequest: [function(data) {
    data = Qs.stringify(data);
    return data;
  }]
});
/**
 * 请求拦截器
 */
keyValue.interceptors.request.use(
  config => {
    return config;
  },
  error => Promise.error(error)
);
// 响应拦截
keyValue.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    const { response } = error;
    if (response) {
      // 请求已发出，但是不在2xx的范围
      return Promise.reject(response);
    }
  }
);

/**
 * 键值对的请求方法
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function keyPost(url, params) {
  return new Promise((resolve, reject) => {
    keyValue.post(url,params)
      .then(res => {
        resolve(res.data);
      })
      .catch(err => {
        reject(err.data);
      });
  });
}